package shoot.FlyingObject;

import java.awt.image.BufferedImage;

/**
 * @author: dongshipan
 * @date: 2021/7/5 17:04
 * @description:
 */
public class Hero extends BaseFlyingObject {

    private static BufferedImage[] images;

    static {
        images = new BufferedImage[2];
        images[0] = readImage("hero0.png");
        images[1] = readImage("hero1.png");
    }

    /**
     * 英雄机速度
     */
    private int step;
    /**
     * 英雄机的生命值
     */
    private int life;
    /**
     * 英雄机的双火力值
     */
    private int doubleFire;
    /**
     * 三倍火力
     */
    private int threeFire;

    /**
     * 创建 Hero 的一个对象
     */
    private static Hero hero = new Hero();

    private Hero() {
        super(FlyConstant.AIRPLANE_WIDTH, FlyConstant.AIRPLANE_HEIGHT,
                FlyConstant.WORLD_WIDTH / 2 - FlyConstant.AIRPLANE_WIDTH / 2, 380);
        this.life = 3;
        this.doubleFire = 0;
        this.threeFire = 0;
    }

    /**
     * 获取唯一的Hero
     */
    public static Hero getHero() {
        return hero;
    }

    /**
     * 英雄机依靠 step 方切换图片
     */
    @Override
    public void step() {
        System.out.println("英雄机切换图片");
    }

    /**
     * 英雄机随鼠标移动的方法
     *
     * @param x 鼠标的 x
     * @param y 鼠标的 y
     */
    public void moveTo(int x, int y) {
        //让英雄机的 x 坐标和鼠标同步
        this.x = x - this.width / 2;
        //让英雄机的 y 坐标和鼠标同步
        this.y = y - this.width / 2;
    }

    int index = 0;

    @Override
    public BufferedImage getImage() {
        index++;
        //每次获得图片切换
        return images[index % images.length];
    }

    //英雄机开炮的方法
    // 由于可能发射一发或者两发子弹，所以该方法的返回值的时一个子弹 类型数组
    public Bullet[] shoot() {
        Bullet[] bullets = null;
        //获得英雄机宽度的四分之一，方便定位子弹出现的 x 位置
        int q = this.width / 4;
        if (threeFire > 0) {
            //发射三官炮
            bullets = new Bullet[3];
            //返回值初始化为长度为 2 的 数组
            bullets[0] = new Bullet(this.x + q - 4, this.y + 30);
            bullets[1] = new Bullet(this.x + q * 3 - 3, this.y + 30);
            bullets[2] = new Bullet(this.x + q * 2 - 3, this.y);
            threeFire--;
        } else if (doubleFire > 0) {
            //发射双管子弹
            bullets = new Bullet[2];
            //返回值初始化为长度为 2 的 数组
            bullets[0] = new Bullet(this.x + q - 4, this.y + 30);
            bullets[1] = new Bullet(this.x + q * 3 - 3, this.y + 30);
            doubleFire--;
        } else {
            // 发射单管子弹
            bullets = new Bullet[1];
            bullets[0] = new Bullet(this.x + q * 2 - 3, this.y);
        }
        return bullets;
    }

    /**
     * 增加火力
     */
    public void addDoubleFire() {
        //加 20 发双管炮
        doubleFire += 20;
        if (doubleFire >= 40) {
            threeFire += (doubleFire / 40) * 20;
            doubleFire -= 40;
        }
    }

    /**
     * 增命
     */
    public void addLife() { //增命
        life++; //生命值+1
    }

    /**
     * 获取命
     */
    public int getLife() {
        return life;
    }

    /**
     * 减命
     */
    public void subtractLife() {
        //减命
        life--;
    }

    /**
     * 清空火力值
     */
    public void clearDoubleFire() {
        doubleFire = 0;
        threeFire = 0;
    }

    /**
     * 获取双倍火力
     */
    public int getDoubleFire() {
        return doubleFire;
    }

    /**
     * 设置双倍火力
     */
    public void setDoubleFire(int doubleFire) {
        this.doubleFire = doubleFire;
    }

    /**
     * 越界处理
     */
    @Override
    public boolean outOfBounds() {
        return false;
    }
}